package com.gxy.learn.cu.utils.reflection;

import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

/**
 * Description(对象属性值修改 )
 * author: Gao xueyong
 * Create at: 2022/7/6 上午9:05
 */
@Slf4j
public class ModifyObjPropertiesByReflection {


    public static void main(String[] args){
        List<ModifyObjVO> list = Arrays.asList(new ModifyObjVO(1L, "小明", new BigDecimal("11111.2222"), new BigDecimal("2333.2352")),
                new ModifyObjVO(2L, "小红", new BigDecimal("3333.2222"), new BigDecimal("4444.2322")));
        log.info("修改前：{}", JSONArray.toJSON(list));
        setVal(list);
        log.info("修改后：{}", JSONArray.toJSON(list));
    }

    private static void setVal(List<ModifyObjVO> ls) {
        if (CollectionUtils.isEmpty(ls)) {
//            为空直接返回
            return;
        }
        for (ModifyObjVO proVO : ls) {
            Field[] declaredFields = proVO.getClass().getDeclaredFields();
            for (Field field : declaredFields) {
//                对于BigDecimal这里不能用instanceof
                if (!StringUtils.equals(field.getGenericType().getTypeName(), "java.math.BigDecimal")) {
//                过滤非BigDecimal类型
                    continue;
                }
                try {
                    field.setAccessible(true);//开启对象的属性访问权和修改权
                    if (null == field) {
                        continue;
                    }
//                        格式化数据 保留两位有效数字
                    //%.2f %. 表示 小数点前任意位数   2 表示两位小数 格式后的结果为f 表示浮点型
                    field.set(proVO, new BigDecimal(String.format("%.2f", field.get(proVO))));
                } catch (IllegalAccessException e) {
                    log.error("修改对象[{}]的属性[{}]失败！", ModifyObjVO.class.getName(), field.getName(), e);
                }
            }
        }
    }
}
